package xin.marcher.module.attribute.service.impl;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import xin.marcher.module.attribute.domain.dto.*;
import xin.marcher.module.attribute.domain.request.ItemSkuAttributeValueRequest;
import xin.marcher.module.attribute.domain.request.QueryItemSkuAttributeValueRequest;
import xin.marcher.module.attribute.domain.request.QuerySkuIdsByAttributeRequest;
import xin.marcher.module.attribute.repository.AttributeRepository;
import xin.marcher.module.attribute.service.ItemSkuAttributeService;
import xin.marcher.module.common.exception.BaseBizException;
import xin.marcher.module.common.exception.CommonErrorCodeEnum;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 商品属性相关操作API
 */
@Service
public class ItemSkuAttributeServiceImpl implements ItemSkuAttributeService {

    @Resource
    private AttributeRepository attributeRepository;

    /**
     * 保存标品和商品属性
     */
    @Override
    public ItemSkuAttributeValueResultDTO saveItemSkuAttributeValue(List<ItemSkuAttributeValueRequest> list) {
        // 入参检查
        checkItemSkuAttributeValueRequest(list);
        attributeRepository.saveItemSkuAttributeValue(list);
        return new ItemSkuAttributeValueResultDTO(true);
    }

    /**
     * 根据商品id类目id查询聚合商品属性值接口
     */
    @Override
    public List<SkuAttributeValueDTO> queryItemSkuAttributeValueList(QueryItemSkuAttributeValueRequest request) {

        // 1. 根据skuId和itemId查询出商品所有的属性
        List<ItemSkuAttributeValueDTO> itemSkuAttributeValueDTOS = attributeRepository.queryItemSkuAttributeValueList(request);

        // 2. 找出使用这个sku使用的是哪个模板
        Long templateId = itemSkuAttributeValueDTOS.get(0).getTemplateId();

        // 3. 查询出模板内容
        List<AttributeTemplateContentDTO> attributeTemplateContentDTOS = attributeRepository
                .queryAttributeTemplateContentByTemplateId(templateId);

        // 4. 查询出相关的属性组
        List<Long> groupIds = attributeTemplateContentDTOS.stream()
                .map(AttributeTemplateContentDTO::getGroupId)
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
        List<AttributeGroupDTO> groupDTOS = attributeRepository.queryGroups(groupIds);
        Map<Long, String> groupIdAndNameMap = groupDTOS.stream()
                .collect(Collectors.toMap(AttributeGroupDTO::getId, AttributeGroupDTO::getGroupName));

        // 5. 查询出相关的属性
        List<Long> attributeIds = attributeTemplateContentDTOS.stream()
                .map(AttributeTemplateContentDTO::getAttributeId)
                .collect(Collectors.toList());
        List<AttributeInfoDTO> attributeInfoDTOS = attributeRepository.queryAttributeInfos(attributeIds);
        Map<Long, String> attributeIdAndNameMap = attributeInfoDTOS.stream()
                .collect(Collectors.toMap(AttributeInfoDTO::getId, AttributeInfoDTO::getAttributeName));

        // 6. 拼装结果
        return buildSkuAttributeValueDTOS(itemSkuAttributeValueDTOS, groupIdAndNameMap, attributeIdAndNameMap);
    }

    /**
     * 根据属性查询条件搜索商品接口
     */
    @Override
    public List<String> querySkuIdsByAttributes(QuerySkuIdsByAttributeRequest request) {
        return attributeRepository.querySkuIdsByAttribute(request);
    }

    private List<SkuAttributeValueDTO> buildSkuAttributeValueDTOS(List<ItemSkuAttributeValueDTO> itemSkuAttributeValueDTOS,
                                                                  Map<Long, String> groupIdAndNameMap,
                                                                  Map<Long, String> attributeIdAndNameMap) {
        List<SkuAttributeValueDTO> skuAttributeValueDTOS = new ArrayList<>();
        for (ItemSkuAttributeValueDTO e : itemSkuAttributeValueDTOS) {
            SkuAttributeValueDTO dto = new SkuAttributeValueDTO();
            if (e.getGroupId() != null) {
                dto.setGroupId(e.getGroupId());
                dto.setGroupName(groupIdAndNameMap.get(e.getGroupId()));
            }
            dto.setAttributeId(e.getAttributeId());
            dto.setAttributeName(attributeIdAndNameMap.get(e.getAttributeId()));
            dto.setAttributeValue(e.getAttributeValue());
            dto.setSort(e.getSort());
            skuAttributeValueDTOS.add(dto);
        }
        skuAttributeValueDTOS.sort(Comparator.comparingInt(SkuAttributeValueDTO::getSort));
        return skuAttributeValueDTOS;
    }

    private void checkItemSkuAttributeValueRequest(List<ItemSkuAttributeValueRequest> list) {
        if (list == null || list.isEmpty()) {
            throw new BaseBizException(CommonErrorCodeEnum.SERVER_ILLEGAL_ARGUMENT_ERROR);
        }
        for (ItemSkuAttributeValueRequest e : list) {
            if (e.getParticipantId() == null || e.getParticipantType() == null
                    || e.getTemplateId() == null || e.getAttributeId() == null
                    || e.getSort() == null) {
                throw new BaseBizException(CommonErrorCodeEnum.SERVER_ILLEGAL_ARGUMENT_ERROR);
            }
            if (StringUtils.isBlank(e.getAttributeValue())) {
                throw new BaseBizException(CommonErrorCodeEnum.SERVER_ILLEGAL_ARGUMENT_ERROR);
            }
        }
    }
}
